//////////////////////////////////////////////////////////////////////
//
// NO_PointerHolder.h
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
#ifndef NO_POINTER_HOLDER
#define NO_POINTER_HOLDER

//////////////////////////////////////////////////////////////////////
// pointer holder 
//////////////////////////////////////////////////////////////////////////
template<class targetClass>
class NO_PointerHolder
{
public:
	//////////////////////////////////////////////////////////////////////
	//con/destruction
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	NO_PointerHolder () : resource(NULL),refCount(0){};
    NO_PointerHolder (targetClass* p) : resource(p),refCount(0){};
    virtual ~NO_PointerHolder(){delete resource;};
	
	//////////////////////////////////////////////////////////////////////
	// retrive
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	int getRefCount(void) const {return refCount;}
	
	//////////////////////////////////////////////////////////////////////
	// modify
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	int remRef	(void)
	{
		int tmpRefCount;
		refCount--;
		tmpRefCount = refCount;
		if (refCount <= 0) delete this;
		return tmpRefCount;
	};

	//////////////////////////////////////////////////////////////////////
	int addRef (void) {return ++refCount;}
	
	//////////////////////////////////////////////////////////////////////////
    targetClass* resource;
	
protected:
	int refCount;
};

#endif
